import {debounce} from "lodash";
import useEditorStore from '../store/editor.js'
import * as monaco from 'monaco-editor'
const editorStore = useEditorStore()
import gsap from 'gsap'
class HandleClass {
    constructor(editor) {
        this.editor = editor;
        this.model = this.editor.getModel()
        this._setEditorContent()
        this.getModel().onDidChangeContent(debounce(this._setEditorContent.bind(this), 500)) //防抖函数，监听代码编辑器输入动作，500ms无动作，则调用setEditorContent
    }

    /*设置监听，当编辑器有输入动作，保存编辑器内容到全局状态*/
    _setEditorContent() {
        //保存编辑器内容到全局管理
        const value = this.getValue()
        editorStore.setEditorContent(value)
    }

//获取编辑器内容
    getValue() {
        return this.editor.getValue()
    }

    //设置编辑器内容
    setValue(v) {
        return this.editor.setValue(v)
    }

    //滚动到某行
    revealLine(lineNumber) {
        return this.editor.revealLine(lineNumber)
    }

    //格式化
    formatDocument() {
        this.editor.trigger('formatDocument', 'editor.action.formatDocument')
    }

    //获取Model
    getModel() {
        return this.editor.getModel()
    }

    //定义语言
    setLanguage(v) {
        monaco.editor.setModelLanguage(this.model, v);
    }
    //插入文本
    edit(code){
        // 插入文本 在当前光标位置或选区
        const range = this.editor.getSelection(); // 获取当前选区范围，默认如果没有选择则为光标位置
        const id = { major: 1, minor: 1 }; // 这是一个版本号，用于跟踪编辑历史
        const edits = [
            {
                range: range,
                text: code || 'Inserted Text',
                forceMoveMarkers: true // 如果有标记位于被修改的范围内，是否移动它们
            }
        ];

        this.editor.executeEdits('my-source', edits); // 执行编辑操作
    }
    //打字机效果插入文本
    animateEdit(code){
        const typingText = code || "这是一段要模拟打字机效果打印的文本。插入到光标位置或者选中文本区";
        let typingIndex = 0;
        let me=this
        const typingInterval = setInterval(() =>{
            if (typingIndex < typingText.length) {
                me.edit(typingText[typingIndex++])
                me.editor.focus(); // 确保编辑器获得焦点
            } else {
                clearInterval(typingInterval);
            }
        }, 100);
    }

    //修改代码
    applyEdits(option) {
        let config = Object.assign({
            startColumn: 0,
            startLineNumber: 0,
            endColumn: 100,
            endLineNumber: 0,
            text: '//请输入正确参数'
        }, option)

        var currentModel = this.editor.getModel()
        currentModel.applyEdits([{
            range: {
                startColumn: config.startColumn,
                startLineNumber: config.startLineNumber,
                endColumn: config.endColumn,
                endLineNumber: config.endLineNumber
            },
            text: config.text
        }], true)
        this.editor.formatDocument()
    }
}

export default HandleClass
